package communicationTCP;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.HashMap;
import java.util.List;

import protocol.Add;
import protocol.Answer;
import protocol.Request;

/**
 * Créer un serveur permettant d'accepter plusieurs connexions
 * 
 * @author Alexandre BOURSIER & Nolan POTIER
 * 
 */
public class Multi_Serveur_Thread extends Thread {
	private Socket socket = null;
	private Dictionnary dico;

	/**
	 * Constructeur normal
	 * 
	 * @param socket
	 *            la socket cible (combinaison adresse ip/port)
	 */
	public Multi_Serveur_Thread(Socket socket) {
		super("Multi_Serveur_Thread");
		this.socket = socket;
	}

	public void run() {
		// Créer les flux d'entrée/sortie
		ObjectOutputStream os;
		ObjectInputStream is;
		Object data;
		try {
			System.out.println("Connexion du client acceptée");
			// Lire dans le flux d'entrée
			is = new ObjectInputStream(socket.getInputStream());
			// Eécrir
			os = new ObjectOutputStream(socket.getOutputStream());
			dico = new Dictionnary();
			boolean exit = false;
			// Boucler indéfinimment tant que le serveur ne se ferme pas
			while (!exit) {
				try {
					// Récupérer les données
					data = is.readObject();

					// Récupérer la taquête cible
					Request request = (Request) data;
					Answer rep = null;

					// Retrouver le type de la requête
					switch (request.getType()) {
					case ADD:
						Add requeteA = (Add) data;
						if (dico.add(requeteA.getName(), requeteA.getNickname())) {
							rep = new Answer("Enregistrement effectué");
						} else {
							rep = new Answer("Surnom existant");
						}
						os.writeObject(rep);
						break;
					case LIST:
						protocol.List requeteL = (protocol.List) data;
						if (requeteL.getName() == null) {
							HashMap<String, List<String>> res = dico.getListe();
							if (res.size() == 0) {
								rep = new Answer("Liste vide",
										new HashMap<String, List<String>>());
							} else {
								rep = new Answer("Liste des enregistrement",
										res);
							}
						} else {
							HashMap<String, List<String>> res = dico
									.list(requeteL.getName());
							if (res.size() == 0) {
								rep = new Answer(
										"Pas d'enregistrement trouvé pour ce nom",
										new HashMap<String, List<String>>());
							} else {
								rep = new Answer("Liste des enregistrement",
										res);
							}
						}
						os.writeObject(rep);
						break;
					case EXIT:
						os.close();
						is.close();
						socket.close();
						System.out.println("Déconnnexion du client");
						exit = true;
						break;
					}
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
					os.close();
					is.close();
					socket.close();
					System.out.println("Fermeture du serveur");
				}
			}
		} catch (IOException e) {
			System.out.println("pute negre");
			System.out.println(e);
		}
	}
}
